#!/bin/dash
# Various ShellCheck build utility functions

# Generally set a ulimit to avoid QEmu using too much memory
ulimit -v "$((10*1024*1024))"
# If we happen to invoke or run under QEmu, make sure to follow execve.
# This requires a patched QEmu.
export QEMU_EXECVE=1

# Retry a command until it succeeds
# Usage: scutil retry 3 mycmd
retry() {
  n="$1"
  ret=1
  shift
  while [ "$n" -gt 0 ]
  do
    "$@"
    ret=$?
    [ "$ret" = 0 ] && break
    n=$((n-1))
  done
  return "$ret"
}

# Install all dependencies from a freeze file
# Usage: scutil install_from_freeze /path/cabal.project.freeze cabal install
install_from_freeze() {
  linefeed=$(printf '\nx')
  linefeed=${linefeed%x}
  flags=$(
    sed 's/constraints:/&\n /' "$1" |
    grep -vw -e rts -e base -e ghc |
    sed -n -e 's/^  *\([^,]*\).*/\1/p' |
    sed -e 's/any\.\([^ ]*\) ==\(.*\)/\1-\2/; te; s/.*/--constraint\n&/; :e')
  shift
  # shellcheck disable=SC2086
  ( IFS=$linefeed; set -x; "$@" $flags )
}

# Run a command under emulation.
# This assumes the correct emulator is named 'qemu' and the chroot is /chroot
# Usage: scutil emu echo "Hello World"
emu() {
  chroot /chroot /bin/qemu /usr/bin/env "$@"
}

"$@"
